package com.ruoyi.web.controller.admin.newSystem;

import com.ruoyi.common.core.domain.AjaxResult;
import com.ruoyi.common.core.domain.entity.DeptDO;
import com.ruoyi.common.enums.CommonStatusEnum;
import com.ruoyi.newSystem.bean.input.DeptCreateReqVO;
import com.ruoyi.newSystem.bean.input.DeptListReqVO;
import com.ruoyi.newSystem.bean.input.DeptUpdateReqVO;
import com.ruoyi.newSystem.bean.output.DeptRespVO;
import com.ruoyi.newSystem.service.DeptService;
import com.ruoyi.newSystem.service.DingTalkDepartmentService;
import jakarta.annotation.Resource;
import org.springframework.beans.BeanUtils;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;

import javax.validation.Valid;
import java.util.Comparator;
import java.util.List;
import java.util.Set;

import static com.ruoyi.common.core.domain.AjaxResult.success;


/**
 * 管理后台 - 部门
 */
@RestController
@RequestMapping("/newSystem/dept")
@Validated
public class DeptController {

    @Resource
    private DeptService deptService;



    /**
     * 创建部门
     *
     * @param reqVO the req vo
     * @return the common result
     */
    @PostMapping("/createDept")
    public AjaxResult createDept(@Valid @RequestBody DeptCreateReqVO reqVO) throws Exception {
        Long deptId = deptService.createDept(reqVO);
        return success(deptId);
    }

    /**
     * 更新部门
     *
     * @param reqVO the req vo
     * @return the common result
     */
    @PutMapping("/updateDept")
    public AjaxResult updateDept(@Valid @RequestBody DeptUpdateReqVO reqVO) throws Exception {
        deptService.updateDept(reqVO);
        return success(true);
    }

    /**
     * 删除部门
     *
     * @param id the id
     * @return the common result
     */
    @PostMapping("/deleteDept")
    public AjaxResult deleteDept(@RequestParam("id") Long id) throws Exception {
        deptService.deleteDept(id);
        return success(true);
    }

    /**
     * 获得部门信息
     *
     * @param id the id
     * @return the dept
     */
    @GetMapping("/getDept")
    public AjaxResult getDept(@RequestParam("id") Long id) {
        DeptDO deptDO = deptService.getDept(id);
        DeptRespVO vo = new DeptRespVO();
        BeanUtils.copyProperties(deptDO,vo);
        return success(vo);
    }

    /**
     * 获得部门信息数组
     *
     * @param reqVO the req vo
     * @return the dept list
     */
    @GetMapping("/getDeptList")
    public AjaxResult getDeptList(DeptListReqVO reqVO) {
        List<DeptDO> list = deptService.getDeptList(reqVO);
        list.sort(Comparator.comparing(DeptDO::getSort));
        return success(list);
    }

    /**
     * 获得指定部门的所有子部门列表
     *
     * @param id 部门编号
     * @return 子部门列表
     */
    @GetMapping("/getChildDeptList")
    public AjaxResult getChildDeptList(@RequestParam("id") Long id) {
        List<DeptDO> childDeptList = deptService.getChildDeptList(id);
        return success(childDeptList);
    }

    /**
     * 获得指定部门的所有子部门 ID 列表（从缓存中）
     *
     * @param id 部门编号
     * @return 子部门 ID 集合
     */
    @GetMapping("/getChildDeptIds")
    public AjaxResult getChildDeptIdListFromCache(@RequestParam("id") Long id) {
        Set<Long> childDeptIds = deptService.getChildDeptIdListFromCache(id);
        return success(childDeptIds);
    }

    /**
     * 获取部门精简信息列表
     * 只包含被开启的部门，主要用于前端的下拉选项
     *
     * @return simple dept list
     */
    @GetMapping("/listAllSimple")
    public AjaxResult getSimpleDeptList() {
        // 获得部门列表，只要开启状态的
        DeptListReqVO reqVO = new DeptListReqVO();
        reqVO.setStatus(CommonStatusEnum.ENABLE.getStatus());
        List<DeptDO> list = deptService.getDeptList(reqVO);
        // 排序后，返回给前端
        list.sort(Comparator.comparing(DeptDO::getSort));
        return success(list);
    }


}
